// package语句：声明当前类所在的包
// com.itheima.capsulation表示这是一个封装特性的演示包
package com.itheima.capsulation;

// public是访问修饰符，表示这个类可以被任何地方访问
// class关键字用于定义一个类
// Student是类名，表示学生类，用于演示Java中的封装特性
public class Student {
    // 定义一个成员变量name，类型为String
    // 没有使用private修饰，默认是包访问权限，同一个包内的类可以直接访问
    String name;
    
    // 注释：解释封装的第一步 - 如何隐藏成员变量
    // 使用private关键字修饰成员变量，使其私有化
    // 私有化的成员变量只能在本类中被直接访问，其他类不能直接访问
    // 这样可以保护数据不被随意修改
    private int age;      // 年龄，使用private修饰，隐藏起来
    private double chinese;  // 语文成绩，使用private修饰，隐藏起来
    private double math;     // 数学成绩，使用private修饰，隐藏起来

    // 注释：解释封装的第二步 - 如何合理暴露成员变量
    // 使用public修饰的getter和setter方法来暴露成员变量的访问
    // 这样可以在方法中添加逻辑控制，保证数据的有效性
    
    // public修饰的setAge方法：用于给age属性赋值
    // 参数int age：接收一个int类型的值作为年龄
    public void setAge(int age){  
        // 添加条件判断，验证年龄的合理性
        // 只允许年龄在0到200之间的有效值
        if(age > 0 && age < 200){
            // this关键字：引用当前对象的成员变量
            // 这里this.age指的是类的成员变量
            // 右边的age是方法参数
            this.age = age;
        }else {
            // 如果年龄数据不合理，给出错误提示
            System.out.println("您赋值的年龄数据非法！");
        }
    }

    // public修饰的getAge方法：用于获取age属性的值
    // 返回值类型是int，表示返回年龄值
    public int getAge(){  
        // 返回成员变量age的值
        return age;
    }

    // public修饰的setChinese方法：用于给chinese属性赋值
    // 参数double chinese：接收一个double类型的值作为语文成绩
    public void setChinese(double chinese) {
        // 使用this关键字区分成员变量和方法参数
        this.chinese = chinese;
    }

    // public修饰的getChinese方法：用于获取chinese属性的值
    // 返回值类型是double，表示返回语文成绩
    public double getChinese() {
        // 返回成员变量chinese的值
        return chinese;
    }

    // public修饰的printAllScore方法：用于计算和打印总成绩
    // void表示这个方法没有返回值
    public void printAllScore(){
        // 输出学生姓名和总成绩
        // 使用+进行字符串连接
        // (chinese + math)计算总成绩
        System.out.println(name + "的总成绩是：" +
                (chinese + math));
    }

    // public修饰的printAverageScore方法：用于计算和打印平均成绩
    // void表示这个方法没有返回值
    public void printAverageScore(){
        // 输出学生姓名和平均成绩
        // (chinese + math) / 2计算平均成绩
        System.out.println(name + "的平均成绩是：" +
                (chinese + math) / 2);
    }
}
